
\documentclass[letter,preprint,10pt]{sigplanconf}


% The version with the final "n" is without final space for cases when
% followed by punctation
\newcommand{\oploop}{op\_par\_loop }
\newcommand{\oploopn}{op\_par\_loop}
\newcommand{\oploops}{op\_par\_loops }
\newcommand{\oploopsn}{op\_par\_loops}

\newcommand{\opset}{op\_set }
\newcommand{\opsetn}{op\_set}
\newcommand{\opsets}{op\_sets }
\newcommand{\opsetsn}{op\_sets}

\newcommand{\opmap}{op\_map }
\newcommand{\opmapn}{op\_map}
\newcommand{\opmaps}{op\_maps }
\newcommand{\opmapsn}{op\_maps}

\newcommand{\opdat}{op\_dat }
\newcommand{\opdatn}{op\_dat}
\newcommand{\opdats}{op\_dats }
\newcommand{\opdatsn}{op\_dats}

\newcommand{\opdset}{op\_decl\_set }
\newcommand{\opdsetn}{op\_decl\_set}
\newcommand{\opdmap}{op\_decl\_map }
\newcommand{\opdmapn}{op\_decl\_map}
\newcommand{\opddat}{op\_decl\_dat }
\newcommand{\opddatn}{op\_decl\_dat}
\newcommand{\oparg}{op\_arg }
\newcommand{\opargn}{op\_arg}
\newcommand{\opargs}{op\_args }
\newcommand{\opargsn}{op\_args}
\newcommand{\opargd}{op\_arg\_dat }
\newcommand{\opargdn}{op\_arg\_dat}

 \usepackage[pdftex]{graphicx, color}
\usepackage{listings}
\lstset{
  language=C, % choose the language of the code
  showspaces=false, % show spaces adding particular underscores
  showstringspaces=false, % underline spaces within strings
  showtabs=false, % show tabs within strings adding particular underscores
%  frame=lines, % adds a frame around the code
  tabsize=2, % sets default tabsize to 2 spaces
  captionpos=b, % sets the caption-position to bottom
  mathescape=true, % activates special behaviour of the dollar sign
  basicstyle=\footnotesize\tt,
  columns=fullflexible,
  commentstyle=\rmfamily\itshape,
  keywordstyle=\bf,
  morekeywords={BARRIER,bool,shared,byte,skip,assert,assume,requires,ensures,
  inv,malloc,free,get,put,wait,asyncpy,fork,join, thread, op_par_loop,
op_arg_dat, op_arg_gbl, op_decl_dat, op_decl_set, op_decl_map,
op_set, op_map, op_dat,loop,over,stage, in, out},
  literate={|->}{$\mapsto$}1
           {exists}{$\exists$}1
           {forall}{$\forall$}1
           {uplus}{$\uplus$}1
           {-*}{$\wand$}1
           {\\/}{$\lor$}1
           {/\\}{$\land$}1
           {empty}{$\emptyset$}1
}

\newcommand{\code}[1]{\lstset{basicstyle=\small\tt}\lstinline£#1£\lstset
{basicstyle=\footnotesize\tt}}
\newcommand{\ourpara}[1]{\vspace{1mm}\noindent\textbf{#1. }}

%ram
\long\def\suggest#1{}

\usepackage{amsmath}
\usepackage {amssymb}
\usepackage{algorithmic}

\usepackage{array}

%\usepackage{mdwmath}
%\usepackage{mdwtab}

\usepackage{eqparbox}
% Also of notable interest is Scott Pakin's eqparbox package for creating
% (automatically sized) equal width boxes - aka "natural width parboxes".


% *** SUBFIGURE PACKAGES ***
%\usepackage{caption}
%\usepackage{subcaption}
%\usepackage{subfig}


\begin{document}

%\conferenceinfo{WXYZ '05}{date, City.} 
%\copyrightyear{2005} 
%\copyrightdata{[to be supplied]} 

%\titlebanner{banner above paper title}        % These are ignored unless
%\preprintfooter{short description of paper}   % 'preprint' option specified.

\title{Effective Resource-Driven Loop Splitting 
for Large Unstructured Mesh Applications on GPUs}
%\subtitle{Subtitle Text, if any}

\authorinfo{}
          {}
          {}
%\authorinfo{Name2\and Name3}
%           {Affiliation2/3}
%           {Email2/3}

\maketitle

\begin{abstract}
  Unstructured mesh applications are widely used in science and
  industry for simulating phenomena as diverse as turbomachinery
  components of jet engines and blood flow in arteries. These are
  examples of irregular applications that are difficult to optimize
  for accelerator targets such as GPUs. Splitting loops is
  a standard technique used for optimizing GPU applications. It breaks
  down large complex parallel loops into smaller units whose
  performance is improved, due to reduced shared memory and register
  requirements. In this paper we introduce a general loop splitting
  methodology for unstructured meshes, which is able to split a complex loop
  into multiple simpler loops. A given loop can be split in different
  ways, depending on the loop features and the target GPU
  hardware. Unlike previous contributions, the introduced technique
  permits synthesizing alternative implementation strategies, without
  the need of transforming the input program. Experiments on a series
  of complex loops from an industrial CFD code show the efficacy of
  our solution both for NVidia Fermi GPUs and Intel multicore
  CPUs. The results show that the version obtained after loop splitting
  always performs better on a GPU compared to the original
  version. The opposite result is instead obtained for the CPU, as the
  original unsplit version performs better when using large
  numbers of threads.
%%We also show how loop splitting impacts on CPU performance.

\end{abstract}

%\category{CR-number}{subcategory}{third-level}

%\terms
%term1, term2

\keywords
Unstructured mesh, Computation splitting, Compilers
\section{Introduction}\label{sec:intro}
\input{intro}

\section{Related Work}\label{sec:rw}
\input{rw}

\section{The OP2 Implementation on GPUs}\label{sec:op2}
\input{op2}

\section{Loop Splitting}\label{sec:split}
\input{splitting}

\section{Experiments}\label{sec:exp}
\input{exp}

\section{Conclusion}\label{sec:conc}
\input{conc}

%Motivation

% 

% \acks

% Acknowledgments, if needed.

% We recommend abbrvnat bibliography style.

\bibliographystyle{abbrvnat}
\bibliography{hydra}

% The bibliography should be embedded for final submission.

% \begin{thebibliography}{}
% \softraggedright

% \bibitem[Smith et~al.(2009)Smith, Jones]{smith02}
% P. Q. Smith, and X. Y. Jones. ...reference text...

% \end{thebibliography}

\end{document}
